home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 45 / Amiga Format CD45 (1999-09)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-11].iso / -serious- / misc / football / exec / alt_league.rexx next >
OS/2 REXX Batch file  |  1999-08-16  |  18KB  |  509 lines

  1. /* ***********************************************************************
  2.  
  3.    ALTERNATIVE LEAGUE PROGRAM FOR FOOTBALL REXX SUITE
  4.   ----------------------------------------------------
  5.                    Copyright  Mark Naughton 1996
  6.  
  7.  
  8. Version    Date     History
  9. --------------------------------------------------------------------------
  10.  1.0       090996   First release.
  11.            090996   As the sort doesnt flip the negative numbers, was
  12.                     thought to be a problem, the league is checked and
  13.                     flipped correctly (LEAGUE2.REXX)
  14.            120996   Amended same code as it didn't work if the two 'signs'
  15.                     were different. Now flips them correctly.
  16.                     (LEAGUE2.REXX)
  17.            180996   Changed record-count so that it is stored in element
  18.                     zero of each array. Deleted some variable assigns
  19.                     that weren't needed. Amended reading into arrays so
  20.                     that the count is set correctly for one element.
  21.                     Removed all "call "references before library routines.
  22.            180996   Removed all "call " references, used element zero to
  23.                     store the record-count. (LEAGUE2.REXX)
  24.            260996   Amended program so that the sortprogram and the REXX
  25.                     program to display the league are called from here
  26.                     instead of a separate script file. Changed so that the
  27.                     count is not stored in 'zero' element.
  28.            270996   Added code for points_per_draw and points_per_loss.
  29.                     Updated to use new filenames. Improved error messages.
  30.                     Inserted code from LEAGUE2.REXX to speed things up and
  31.                     to tidy the code. Finally got the table to be sorted
  32.                     properly, using a version of VSORTA from asd_library.
  33.  1.1       111196   Added argument so it can become a component of
  34.                     FOOTBALL. Removed GAMEPLAY and EXTRACT. Removed all
  35.                     messages.
  36.            131196   Added checks for files - if not found, exits without
  37.                     a message.
  38.            141196   Added code to highlight the leader.
  39.            201196   Added code to sort out which teams are relegated and
  40.                     then to display the line at the correct place.
  41.            211196   Updated and tidied the display.
  42.            231296   Shortened lines when displaying the league.
  43.            241296   Tidied up display again.
  44.  1.2       110497   Added code to support Points_Per_Goals. Amended the
  45.                     table display.
  46.            070597   Amended code that checks league_file to see if they
  47.                     are in the right order - was using wrong parameters.
  48.            080597   Amended as FOOTSORT is only used for league table file
  49.                     sorting.
  50.  2.0       240997   Tidied up code and added errors in case any files cannot
  51.                     be read or written to. Simplified reading of teams and
  52.                     data (getting it from '.df' now, not '.stats') and
  53.                     getting the total teams without having to re-read the
  54.                     '.stats' file. Added promotion bar.
  55.            151297   Tidied display.
  56.            030599   Fixed bug in relegation bar - it would show it at the
  57.                     maximum position for the number of teams relegated but
  58.                     this wasn't true when a team was relegated and the
  59.                     others still had to fight it out - same for the
  60.                     promotion bar.
  61.            050599   Okay, I decided to change the display again.
  62.  2.1       150599   At request of Jan Andersen, I have modified League.rexx
  63.                     to display home and away stats in the league table.
  64.                     This can be used to replace the standard league program.
  65.            170599   Fixed bug in display of relegated teams as they all
  66.                     showed in upper case when 2 hadn't had the misfortune.
  67.                     Fixed bug reported by Kev (Thanks!) where Bolton from
  68.                     the 97/98 English Premiership weren't upper-cased -
  69.                     traced to the fact that they had the same points as
  70.                     the place above - changed so calculation is changed if
  71.                     its the last game of the season.
  72.            170699   Fixed bug where if all teams had zero points, the
  73.                     promotion bar was still displayed.
  74.  
  75.  
  76. **************************************************************************
  77.  
  78. Procedure
  79. ---------
  80.  
  81. 1. Check files exist. Open 'Teams.df'.
  82. 2. Read in teams and their associated data; WIN, DRAW, LOST etc.
  83. 3. Close file. Open 'Teams.stats'. Read data. Close file.
  84. 4. Open 'Teams.sf' for reading.
  85. 5. Read each line that has a game played, and from that get the team names
  86.    and the score. Then update the relevant team data with the result.
  87. 6. Write data in form of a league table to an output file.
  88. 7. Close file.
  89. 8. Call external sortprogram to sort the output file.
  90. 9. Open 'Teams.stats' and read the number of teams, then close.
  91. 10.Open 'League.output' and read contents into two arrays.
  92. 11.Check to see if the teams are in the right order, comparing the points
  93.    of each one with the next and if the goal-differences are in the wrong
  94.    order, then swap the two teams.
  95. 12.Check to see which teams are relegated by calculating the maximum number
  96.    of points available and seeing if the lower teams are able to move up.
  97.    If not they are relegated, according to the number set.
  98. 13.Check to see which teams are promoted by using the same method as above.
  99. 14.Display league and exit.
  100.  
  101. ************************************************************************** */
  102. ARG league_file
  103.  
  104. version      = 2
  105. league_file  = "Data/" || league_file
  106. input_file   = '.stats'
  107. input2_file  = '.sf'
  108. input3_file  = '.df'
  109. output_file  = 'Data/League.output'
  110. title        = '*LEAGUE_NAME='
  111. points_win   = '*POINTS_PER_WIN='
  112. points_drw   = '*POINTS_PER_DRW='
  113. points_lse   = '*POINTS_PER_LSE='
  114. points_gls   = '*POINTS_PER_GLS='
  115. releg        = '*RELEGATION='
  116. playother    = '*PLAY_OTHER='
  117. promoted     = '*PROMOTED='
  118. team_counter = '*COUNTR='
  119. team         = '*TEAM='
  120. played       = '*PLY='
  121. won          = '*WIN='
  122. drawn        = '*DRW='
  123. lost         = '*LST='
  124. goalsf       = '*GOF='
  125. goalsa       = '*GOA='
  126. points       = '*PTS='
  127. separator    = '*'
  128. teams.       = '???'
  129. teams2.      = '???'
  130. m_ply.       = '???'
  131. m_win.       = '???'
  132. m_drw.       = '???'
  133. m_lost.      = '???'
  134. m_gof.       = '???'
  135. m_goa.       = '???'
  136. m_pts.       = '???'
  137. h_ply.       = '???'
  138. h_win.       = '???'
  139. h_drw.       = '???'
  140. h_lost.      = '???'
  141. h_gof.       = '???'
  142. h_goa.       = '???'
  143. h_pts.       = '???'
  144. a_ply.       = '???'
  145. a_win.       = '???'
  146. a_drw.       = '???'
  147. a_lost.      = '???'
  148. a_gof.       = '???'
  149. a_goa.       = '???'
  150. a_pts.       = '???'
  151. ah_teams.    = '???'
  152. teams_ctr    = 0
  153. playo        = 2
  154. reg          = 2
  155. ptsgls       = 0
  156. ptswin       = 2
  157. ptsdrw       = 1
  158. ptslse       = 0
  159. promo        = 0
  160. not_played   = '__   __'
  161.  
  162.  
  163. if exists(league_file || input_file) = 0  then exit
  164. if exists(league_file || input2_file) = 0 then exit
  165. if exists(league_file || input3_file) = 0 then exit
  166.  
  167.  
  168. tcount = 0
  169. if open(datafile,league_file || input3_file,'r') then do
  170.    do while ~eof(datafile)
  171.       line = readln(datafile)
  172.       if pos(title,line) > 0 then        league_title = delstr(line,1,13)
  173.       if pos(points_win,line) > 0 then   ptswin=delstr(line,1,16)
  174.       if pos(points_drw,line) > 0 then   ptsdrw=delstr(line,1,16)
  175.       if pos(points_lse,line) > 0 then   ptslse=delstr(line,1,16)
  176.       if pos(points_gls,line) > 0 then   ptsgls=delstr(line,1,16)
  177.       if pos(releg,line) > 0 then        reg = delstr(line,1,12)
  178.       if pos(playother,line) > 0 then    playo = delstr(line,1,12)
  179.       if pos(promoted,line) > 0 then     promo = delstr(line,1,10)
  180.       if pos(separator,line) = 0 then do
  181.          line = strip(line)
  182.          tcount          = tcount + 1
  183.          teams.tcount    = line
  184.          ah_teams.tcount = line
  185.       end
  186.    end
  187.    close(datafile)
  188. end
  189. else do
  190.    say
  191.    say "ERROR :    (League)"
  192.    say
  193.    say "Unable to open '"league_file || input3_file"' file."
  194.    exit
  195. end
  196.  
  197. if open(datafile,league_file || input_file,'r') then do
  198.    do while ~eof(datafile)
  199.       line = readln(datafile)
  200.       if pos(team,line) > 0 then
  201.          teams_ctr = teams_ctr + 1
  202.       if pos(played,line) > 0 then  m_ply.teams_ctr  = delstr(line,1,5)
  203.       if pos(won,line) > 0 then     m_won.teams_ctr  = delstr(line,1,5)
  204.       if pos(drawn,line) > 0 then   m_drw.teams_ctr  = delstr(line,1,5)
  205.       if pos(lost,line) > 0 then    m_lost.teams_ctr = delstr(line,1,5)
  206.       if pos(goalsf,line) > 0 then  m_gof.teams_ctr  = delstr(line,1,5)
  207.       if pos(goalsa,line) > 0 then  m_goa.teams_ctr  = delstr(line,1,5)
  208.       if pos(points,line) > 0 then  m_pts.teams_ctr  = delstr(line,1,5)
  209.    end
  210.    close(datafile)
  211. end
  212. else do
  213.    say
  214.    say "ERROR :    (League)"
  215.    say
  216.    say "Unable to open '"league_file || input_file"'."
  217.    exit
  218. end
  219.  
  220. ggg = 0
  221. do i=1 to teams_ctr
  222.    if m_ply.i ~= 0 then ggg = 1
  223. end
  224. if ggg = 1 then do
  225.    do i=1 to teams_ctr
  226.       h_ply.i = m_ply.i
  227.       h_won.i = m_won.i
  228.       h_drw.i = m_drw.i
  229.       h_lost.i= m_lost.i
  230.       h_gof.i = m_gof.i
  231.       h_goa.i = m_goa.i
  232.       h_pts.i = m_pts.i
  233.    end
  234. end
  235. else do
  236.    do i=1 to teams_ctr
  237.       h_ply.i = 0
  238.       h_won.i = 0
  239.       h_drw.i = 0
  240.       h_lost.i= 0
  241.       h_gof.i = 0
  242.       h_goa.i = 0
  243.       h_pts.i = 0
  244.       a_ply.i = 0
  245.       a_won.i = 0
  246.       a_drw.i = 0
  247.       a_lost.i= 0
  248.       a_gof.i = 0
  249.       a_goa.i = 0
  250.       a_pts.i = 0
  251.    end
  252. end
  253.  
  254. if open(datafile,league_file || input2_file,'r') then do
  255.    do while ~eof(datafile)
  256.       line = readln(datafile)
  257.       if pos(separator,line) = 0 then do
  258.          if pos(not_played,line) = 0 then do
  259.             home_team = strip(substr(line,1,30))
  260.             goals_for = substr(line,32,2)
  261.             goals_aga = substr(line,37,2)
  262.             away_team = strip(substr(line,41,30))
  263.  
  264.             do i=1 to teams_ctr
  265.                if home_team = teams.i then do
  266.                   m_ply.i = m_ply.i + 1
  267.                   m_gof.i = m_gof.i + goals_for
  268.                   m_goa.i = m_goa.i + goals_aga
  269.                   h_ply.i = h_ply.i + 1
  270.                   h_gof.i = h_gof.i + goals_for
  271.                   h_goa.i = h_goa.i + goals_aga
  272.                   if goals_for = goals_aga then do
  273.                      m_drw.i = m_drw.i + 1
  274.                      m_pts.i = m_pts.i + ptsdrw
  275.                      h_drw.i = h_drw.i + 1
  276.                      h_pts.i = h_pts.i + ptsdrw
  277.                   end
  278.                   if goals_for < goals_aga then do
  279.                      m_lost.i= m_lost.i + 1
  280.                      m_pts.i = m_pts.i + ptslse
  281.                      h_lost.i= h_lost.i + 1
  282.                      h_pts.i = h_pts.i + ptslse
  283.                   end
  284.                   if goals_for > goals_aga then do
  285.                      m_won.i = m_won.i + 1
  286.                      m_pts.i = m_pts.i + ptswin
  287.                      h_won.i = h_won.i + 1
  288.                      h_pts.i = h_pts.i + ptswin
  289.                   end
  290.                   m_pts.i = m_pts.i + (goals_for * ptsgls)
  291.                end
  292.             end
  293.             do i=1 to teams_ctr
  294.                if away_team = teams.i then do
  295.                   m_ply.i = m_ply.i + 1
  296.                   m_gof.i = m_gof.i + goals_aga
  297.                   m_goa.i = m_goa.i + goals_for
  298.                   a_ply.i = a_ply.i + 1
  299.                   a_gof.i = a_gof.i + goals_aga
  300.                   a_goa.i = a_goa.i + goals_for
  301.                   if goals_for = goals_aga then do
  302.                      m_drw.i = m_drw.i + 1
  303.                      m_pts.i = m_pts.i + ptsdrw
  304.                      a_drw.i = a_drw.i + 1
  305.                      a_pts.i = a_pts.i + ptsdrw
  306.                   end
  307.                   if goals_for < goals_aga then do
  308.                      m_won.i = m_won.i + 1
  309.                      m_pts.i = m_pts.i + ptswin
  310.                      a_won.i = a_won.i + 1
  311.                      a_pts.i = a_pts.i + ptswin
  312.                   end
  313.                   if goals_for > goals_aga then do
  314.                      m_lost.i= m_lost.i + 1
  315.                      m_pts.i = m_pts.i + ptslse
  316.                      a_lost.i= a_lost.i + 1
  317.                      a_pts.i = a_pts.i + ptslse
  318.                   end
  319.                   m_pts.i = m_pts.i + (goals_aga * ptsgls)
  320.                end
  321.             end
  322.          end
  323.       end
  324.    end
  325.    close(datafile)
  326. end
  327. else do
  328.    say
  329.    say "ERROR :    (League)"
  330.    say
  331.    say "Unable to open '"league_file || input2_file"'."
  332.    exit
  333. end
  334.  
  335. if open(outfile,output_file,"w") then do
  336.    do i=1 to teams_ctr
  337.       line = left(teams.i,30,' ')
  338.       mp = right(m_ply.i,3)
  339.       mw = right(m_won.i,3)
  340.       md = right(m_drw.i,3)
  341.       ml = right(m_lost.i,3)
  342.       mgf = right(m_gof.i,5)
  343.       mga = right(m_goa.i,5)
  344.       mpts = right(m_pts.i,7)
  345.       writech(outfile,line"   "mp" "mw" "md" "ml" "mgf" "mga"  "mpts"      ")
  346.       itemp=mgf-mga
  347.       if itemp>0 then
  348.          itemp=insert("+",itemp,0,1)
  349.       itemp=right(itemp,4)
  350.       writeln(outfile,itemp)
  351.    end
  352.    close(outfile)
  353. end
  354. else do
  355.    say
  356.    say "ERROR :    (League)"
  357.    say
  358.    say "Unable to update the League. Cannot write to '"output_file"'."
  359.    exit
  360. end
  361.  
  362. address command 'Exec/footsort '
  363.  
  364. if open(datafile2,output_file,'r') then do
  365.    do i=1 to tcount
  366.       line = readln(datafile2)
  367.       teams.i  = line
  368.       teams2.i = line
  369.    end
  370.    close(datafile2)
  371. end
  372. else do
  373.    say
  374.    say "ERROR :    (League)"
  375.    say
  376.    say "Cannot read '"output_file"'."
  377.    exit
  378. end
  379.  
  380. ctr = 0
  381. do while swapctr > 0
  382.    swapctr=9
  383.    do i=1 to tcount-1                               /* was 64,4 and 77,4 */
  384.       swapdone=0
  385.       j = i + 1
  386.       if strip(substr(teams.i,64,7)) = strip(substr(teams.j,64,7)) then do
  387.          goaldiffa = strip(substr(teams.i,77,5))
  388.          goaldiffb = strip(substr(teams.j,77,5))
  389.          if goaldiffa < goaldiffb then do
  390.             teams.i = teams2.j
  391.             teams.j = teams2.i
  392.             teams2.i= teams.i
  393.             teams2.j= teams.j
  394.             swapdone= 1
  395.             ctr = ctr + 1
  396.          end
  397.       end
  398.       if swapdone = 1 then
  399.          break
  400.    end
  401.    if ctr = 0 then
  402.       swapctr = 0
  403.    else
  404.       ctr = 0
  405. end
  406.  
  407. posreg   = 0
  408. pospro   = 0
  409. if reg > 0 then do             /* this bit of code checks to see which teams are relegated */
  410.    wherereg = tcount - reg
  411.    regpts   = strip(substr(teams.wherereg,64,7))         /* was 64,4 */
  412.    do i=tcount to 1 by -1
  413.       b = (((tcount-1) * playo) - strip(substr(teams.i,35,3))) * ptswin  /* was 36,2 */
  414.       c = strip(substr(teams.i,64,7)) + b
  415.       if c < regpts then posreg = i                 /* calculates the max points avail */
  416.       if c = regpts & strip(substr(teams.i,35,3)) = ((tcount-1) * playo) then
  417.          posreg = i
  418.    end
  419.    if posreg < (wherereg+1) & posreg ~= 0 then      /* was 0 - set to reqd pos if higher */
  420.       posreg = wherereg + 1
  421.                                                     /* Bug fix 0305 - relegation bar problems */
  422. end
  423.  
  424. /* ---------------------------------------------- */
  425.  
  426.  
  427. if promo > 0 then do          /* this bit of code checks to see which teams are promoted */
  428.    wherepro = promo + 1
  429.    propts   = strip(substr(teams.wherepro,64,7))         /* was 64,4 */
  430.    do i=1 to tcount
  431.       if strip(substr(teams.i,35,3)) > 0 then
  432.          b = (((tcount-1) * playo) - strip(substr(teams.i,35,3))) * ptswin
  433.       else
  434.          b = 0
  435.       c = strip(substr(teams.i,64,7)) + b
  436.       if c > propts then pospro = i                 /* calculates the max points avail */
  437.    end
  438.    if pospro > (wherepro-1) & pospro ~= 0 then
  439.       pospro = wherepro - 1                         /* was 0 - set to reqd pos if lower */
  440. end
  441.  
  442. /* ---------------------------------------------- */
  443.  
  444. lengtt = 0
  445. do i=1 to tcount
  446.    if length(ah_teams.i) > lengtt then
  447.       lengtt = length(ah_teams.i)
  448. end
  449. if lengtt > 30 then
  450.    lengtt = 30
  451.  
  452. tabtitle = "  Pl Won Drw Lst    GF    GA       "left(" ",lengtt+3,' ')"  Pl Won Drw Lst    GF    GA     Pts     GD"
  453. tabunder = left("-",length(tabtitle)+4,'-')
  454.  
  455. say
  456. say center(league_title,88)
  457. say tabunder
  458. say
  459. if ggg = 1 then do
  460.    say "This league does not contain all the scores as it was started mid-way. Therefore the"
  461.    say "data has been recorded under HOME."
  462. end
  463. say
  464. say "  Home                        Pos. "left("Team",lengtt+3,' ')"  Away"
  465. say
  466. say tabtitle
  467. say tabunder
  468. say
  469.  
  470. do i=1 to tcount
  471.    team1 = strip(substr(teams.i,1,30))
  472.    do j=1 to tcount
  473.       if pos(team1,ah_teams.j) > 0 then do
  474.          h1 = right(h_ply.j,4,' ')
  475.          h2 = right(h_won.j,4,' ')
  476.          h3 = right(h_drw.j,4,' ')
  477.          h4 = right(h_lost.j,4,' ')
  478.          h5 = right(h_gof.j,6,' ')
  479.          h6 = right(h_goa.j,6,' ')
  480.          a1 = right(a_ply.j,4,' ')
  481.          a2 = right(a_won.j,4,' ')
  482.          a3 = right(a_drw.j,4,' ')
  483.          a4 = right(a_lost.j,4,' ')
  484.          a5 = right(a_gof.j,6,' ')
  485.          a6 = right(a_goa.j,6,' ')
  486.          gdif = substr(teams.i,76,5)
  487.          if strip(gdif) = 0 then
  488.             gdif = " "
  489.          rocky = h1||h2||h3||h4||h5||h6||"  ("right(i,2,' ')") "left(ah_teams.j,lengtt+3)||a1||a2||a3||a4||a5||a6" "right(strip(substr(teams.i,64,7)),7,' ')"   "gdif
  490.       end
  491.    end
  492.    if i >= posreg & posreg~=0 then rocky = upper(rocky)
  493.    if i = 1 then rocky = upper(rocky)
  494.    say rocky
  495.    if i = (tcount-reg) & reg > 0 & posreg~=0 then do       /* was posreg */
  496.       say left("_",length(tabunder),'_')
  497.       say
  498.    end
  499.    if i = (promo) & promo > 0 & pospro~=0 then do        /* was pospro */
  500.       say left("_",length(tabunder),'_')
  501.       say
  502.    end
  503. end
  504.  
  505. say
  506. say tabunder
  507. say
  508.  
  509. exit